package daily;

/**
 * @author MtRider
 * @version 1.0
 * @description 整数反转
 * <p>
 * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 * <p>
 * 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ，就返回 0。
 * <p>
 * 假设环境不允许存储 64 位整数（有符号或无符号）。
 * <p>
 * 输入：x = 123
 * 输出：321
 * @GiteeAndGithub MtRider
 * @date 2022/4/24 10:07
 */
public class demo12 {
    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);
    }

    /**
     * 先把符号取下来，保证正负数统一
     * 再将数字转字符串后与最大值进行比较（长度相同且最大位置更大）
     * 转回数字后赋予符号
     * tip:leetcode上报错。。。超过约束条件了
     *
     * @param x
     * @return
     */

    public static int reverse(int x) {
        int flag = x > 0 ? 1 : -1;
        x = Math.abs(x);
        int max = Integer.MAX_VALUE;
        if (String.valueOf(x).length() > String.valueOf(max).length()
                && String.valueOf(x).compareTo(String.valueOf(max)) > 0) {
            return 0;
        }
        String result = new StringBuffer(String.valueOf(x)).reverse().toString();
        return Integer.parseInt(result) * flag;
    }

    /**
     * result%10、x%10是result与x的相同位上的数字，比如都是个位、十位、百位...
     *
     * Integer.MAX_VALUE+1 = Integer.MIN_VALUE
     * 同样地 Integer.MIN_VALUE-1 = Integer.MAX_VALUE（因为java中int类型最高位为符号位，超出范围符号位会改变）
     * 所以经过 res = res * 10 + x % 10 这一步后：
     * 1.如果res超出最大值，则它会由正数变成一个负数
     * 2.如果res超出最小值，则它会由负数变成一个正数
     * 总之这两种情况中res的正负号肯定与x是相反的
     * 所以，如果result超出范围，result%10与x%10肯定是一个为正数，一个为负数，不可能相等，反之如果result没有超出范围，result%10与x%10肯定相等。
     * @param x
     * @return
     */
    public static int reverse2(int x) {
        int res = 0;
        while (x != 0) {
            res = res * 10 + x % 10;
            if (res % 10 != x % 10) {
                return 0;
            }
            x /= 10;
        }
        return res;
    }
}
